//! PartyMod 高级使用示例
//! 
//! 这个示例展示了 PartyMod 库的高级功能，包括：
//! - 批量数据操作
//! - 复杂查询
//! - 示例数据管理
//! - 集成测试

use partymod::{
    PartyMod, PartyModConfig, Result,
    models::*,
    services::*,
    sample_data::SampleDataManager,
    tests::IntegrationTestSuite,
};
use std::env;

#[tokio::main]
async fn main() -> Result<()> {
    println!("=== PartyMod 高级使用示例 ===");
    
    // 1. 初始化 PartyMod
    let party_mod = PartyMod::from_env().await
        .or_else(|_| PartyMod::with_default_config())
        .await?;
    
    println!("✓ PartyMod 初始化成功");
    
    // 2. 运行集成测试
    println!("\n--- 运行集成测试 ---");
    let mut test_suite = IntegrationTestSuite::new().await?;
    let test_report = test_suite.run_all_tests().await?;
    
    if !test_report.all_passed() {
        println!("⚠️ 部分测试失败，但继续执行示例");
    }
    
    // 3. 加载示例数据
    println!("\n--- 加载示例数据 ---");
    let mut sample_manager = SampleDataManager::new(party_mod.client().clone());
    
    // 清理旧数据（可选）
    if env::var("CLEAN_SAMPLE_DATA").is_ok() {
        println!("清理现有示例数据...");
        sample_manager.cleanup_sample_data().await?;
    }
    
    // 加载示例数据
    sample_manager.load_all_sample_data().await?;
    println!("✓ 示例数据加载完成");
    
    // 验证示例数据
    let sample_report = sample_manager.verify_sample_data().await?;
    sample_report.print_report();
    
    // 4. 复杂查询示例
    println!("\n--- 复杂查询示例 ---");
    
    let party_service = party_mod.party_service();
    let organization_service = party_mod.organization_service();
    let customer_service = party_mod.customer_service();
    let contact_service = party_mod.contact_service();
    
    // 查询所有个人类型的Party
    let persons = party_service.find_parties(
        Some("PERSON"),
        None,
        None,
        Some(20),
        Some(0)
    ).await?;
    
    println!("✓ 找到{}个个人", persons.data.len());
    
    // 查询所有组织类型的Party
    let organizations = party_service.find_parties(
        Some("PARTY_GROUP"),
        None,
        None,
        Some(20),
        Some(0)
    ).await?;
    
    println!("✓ 找到{}个组织", organizations.data.len());
    
    // 5. 组织层级结构示例
    println!("\n--- 组织层级结构示例 ---");
    
    if !organizations.data.is_empty() {
        let org_id = &organizations.data[0].party_id;
        
        // 获取组织层级结构
        let hierarchy = organization_service.get_organization_hierarchy(org_id, Some(3)).await?;
        println!("✓ 组织层级结构: {:?}", hierarchy);
        
        // 获取组织成员
        let members = organization_service.get_organization_members(org_id, None).await?;
        println!("✓ 组织成员数量: {}", members.len());
        
        // 按角色查询成员
        let employees = organization_service.get_organization_members(org_id, Some("EMPLOYEE")).await?;
        println!("✓ 员工数量: {}", employees.len());
    }
    
    // 6. 客户关系管理示例
    println!("\n--- 客户关系管理示例 ---");
    
    // 获取活跃客户列表
    let active_customers = customer_service.get_active_customers(Some(10), Some(0)).await?;
    println!("✓ 活跃客户数量: {}", active_customers.data.len());
    
    // 如果有销售代表，查询其客户
    if !persons.data.is_empty() {
        let sales_rep_id = &persons.data[0].party_id;
        let rep_customers = customer_service.get_sales_rep_customers(sales_rep_id, Some(10), Some(0)).await?;
        println!("✓ 销售代表 {} 的客户数量: {}", sales_rep_id, rep_customers.data.len());
    }
    
    // 7. 联系方式管理示例
    println!("\n--- 联系方式管理示例 ---");
    
    if !persons.data.is_empty() {
        let person_id = &persons.data[0].party_id;
        
        // 获取联系方式信息
        let contact_info = contact_service.get_party_contact_info(person_id).await?;
        println!("✓ {} 的联系方式: {:?}", person_id, contact_info);
        
        // 获取邮政地址详情
        let addresses = contact_service.get_party_postal_addresses(person_id).await?;
        println!("✓ {} 的邮政地址数量: {}", person_id, addresses.len());
        
        // 获取电话号码详情
        let phones = contact_service.get_party_phone_numbers(person_id).await?;
        println!("✓ {} 的电话号码数量: {}", person_id, phones.len());
        
        // 获取邮箱地址详情
        let emails = contact_service.get_party_email_addresses(person_id).await?;
        println!("✓ {} 的邮箱地址数量: {}", person_id, emails.len());
    }
    
    // 8. 批量操作示例
    println!("\n--- 批量操作示例 ---");
    
    // 创建多个测试用户
    let mut test_party_ids = Vec::new();
    
    for i in 1..=5 {
        let party_id = party_service.create_person(
            Some(&format!("测试{}", i)),
            None,
            Some("用户"),
            Some("先生"),
            None,
            None,
            None,
            None
        ).await?;
        
        test_party_ids.push(party_id);
    }
    
    println!("✓ 批量创建了{}个测试用户", test_party_ids.len());
    
    // 为测试用户批量添加联系方式
    for (i, party_id) in test_party_ids.iter().enumerate() {
        let email = format!("test{}@example.com", i + 1);
        contact_service.add_email_address(
            party_id,
            &email,
            "PRIMARY_EMAIL",
            true
        ).await?;
    }
    
    println!("✓ 为测试用户批量添加了邮箱地址");
    
    // 9. 搜索功能示例
    println!("\n--- 搜索功能示例 ---");
    
    // 模糊搜索
    let search_results = party_service.find_parties(
        None,
        None,
        Some("测试"),
        Some(10),
        Some(0)
    ).await?;
    
    println!("✓ 搜索'测试'找到{}个结果", search_results.data.len());
    
    // 10. 数据统计示例
    println!("\n--- 数据统计示例 ---");
    
    // 统计各类型Party数量
    let all_parties = party_service.find_parties(None, None, None, Some(1000), Some(0)).await?;
    let person_count = all_parties.data.iter().filter(|p| p.party_type_id == "PERSON").count();
    let group_count = all_parties.data.iter().filter(|p| p.party_type_id == "PARTY_GROUP").count();
    
    println!("✓ 数据统计:");
    println!("  - 总Party数量: {}", all_parties.data.len());
    println!("  - 个人数量: {}", person_count);
    println!("  - 组织数量: {}", group_count);
    
    // 11. 清理测试数据（可选）
    if env::var("CLEANUP_TEST_DATA").is_ok() {
        println!("\n--- 清理测试数据 ---");
        
        for party_id in &test_party_ids {
            if let Err(e) = party_service.delete_party(party_id).await {
                println!("⚠️ 删除测试用户{}失败: {}", party_id, e);
            }
        }
        
        println!("✓ 测试数据清理完成");
    }
    
    println!("\n=== 高级示例执行完成 ===");
    
    Ok(())
}